import datetime
import random

from flask import session, g, request, redirect, url_for
from qiniu import put_data, BucketManager

from models import db
from models.index import User
from . import *


def show_top_6_news_style(index):
    if index == 1:
        return 'first'
    elif index == 2:
        return 'second'
    elif index == 3:
        return 'third'
    return ''


def verify_suffix(filename):
    ALLOWED_EXTENSIONS = ['png', 'jpg', 'JPG', 'PNG', 'gif', 'GIF']
    suffix = filename.rsplit('.', 1)[1]
    if '.' in filename and suffix in ALLOWED_EXTENSIONS:
        return suffix.lower()
    else:
        return None


def create_uuid():  # 生成唯一的图片的名称字符串，防止图片显示时的重名问题
    nowTime = datetime.datetime.now().strftime("%Y%m%d%H%M%S")  # 生成当前时间
    randomNum = random.randint(0, 100)  # 生成的随机整数n，其中0<=n<=100
    if randomNum <= 10:
        randomNum = str(0) + str(randomNum)
    uniqueNum = str(nowTime) + str(randomNum)
    return uniqueNum


def is_none(url):
    if not url:
        return '/static/index/images/person01.png'
    else:
        return url


def is_followed(user):
    now_user = db.session.query(User).filter(User.id == session.get("user_id")).first()
    if now_user in user.followers:
        return True
    else:
        return False


def upload_file_qiniu(file_name, input_data):
    '''
    :param inputdata: bytes类型的数据
    :return: 文件在七牛的上传名字
    '''
    # 生成上传 Token，可以指定过期时间等
    token = q.upload_token(QINIU_BUCKET_NAME)
    # 如果需要对上传的图片命名，就把第二个参数改为需要的名字
    ret1, ret2 = put_data(token, file_name, data=input_data)
    # print('ret1:', ret1)
    # print('ret2:', ret2)

    # 判断是否上传成功
    if ret2.status_code != 200:
        raise Exception('文件上传失败')
    img_url = QINIU_BUCKET_DOMAIN + '/' + ret1.get("key")
    return img_url


def delete(filename):
    bucket = BucketManager(q)
    # print(filename)
    index = filename.rfind('/')
    # print(index)
    filename = filename[index + 1:]
    reform, fo = bucket.delete(QINIU_BUCKET_NAME, filename)
    # if reform != None:
    #     print('已经成功地将{}->>X'.format(filename))
    # else:
    #     print('这里出现了一个小错误.(可能是空间并没有这个文件)')


def show_news_status_name(index):
    if index == 0:
        return "已通过"
    elif index == 1:
        return "审核中"
    elif index == -1:
        return "未通过"
    return ""


def show_news_status_style_name(index):
    if index == 0:
        return "pass"
    elif index == 1:
        return "review"
    elif index == -1:
        return "nopass"
    return ""


def set_after_request_handle_fuc(app):
    """
    对flask对象 设置 每次调用视图函数之前 要执行的事
    :param app:
    :return:
    """

    @app.before_request
    def before_request():
        # 查询当前登录用户，如果未登录那么g.user为None，如果登陆了g.user就是当前登录对象
        # 之所以用g变量，是因为我们可以把需要给视图函数传递的参数，通过给g对象添加属性的方式让g进行携带
        # 然后在视图函数中就可以通过g.user提取出来，也就是说g能够帮我们在多个函数之间传递参数
        user_id = session.get("user_id")
        g.user = db.session.query(User).filter(User.id == user_id).first()

        # 如果请求路径是/admin开始，那么就检查是否有管理员权限
        # 如果是管理员的话g.user.is_admin此时是1，如果不是 那么就是0
        if request.path.startswith("/admin") and not g.user.is_admin:
            # 如果不是管理员，还想访问URL以/admin开始页面，则返回首页
            return redirect(url_for('index.index'))
